package com.xyazm.order.manager.impl;

import com.xyazm.common.utils.DateFormatUtil;
import com.xyazm.common.utils.NumberUtil;
import com.xyazm.core.service.ISegmentIDGenService;
import com.xyazm.order.enums.OrderNoTypeEnum;
import com.xyazm.order.exception.OrderBizException;
import com.xyazm.order.exception.OrderErrorCodeEnum;
import com.xyazm.order.manager.IOrderNoManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

@Service
public class OrderNoManagerImpl implements IOrderNoManager {

    @Autowired
    private ISegmentIDGenService segmentIDGenService;



    /**
     * 19位，
     * 起始2位是业务类型，⽐如10开头是正向，20开头是逆向，
     * 中间6位是⽇期，然后中间8位是 序列号，
     * 最后3位是⽤户ID后三位 8位序列号基于数据⾃增主键⽣成,⽤户ID不⾜3位前⾯补0
     * @author xuyou
     * 2022/4/10 0010 20:22
    */
    @Override
    public String genOrderId(Integer orderNoType, String userId) {
        // 检查orderNoType是否正确
        OrderNoTypeEnum orderNoTypeEnum = OrderNoTypeEnum.getByCode(orderNoType);
        if (orderNoTypeEnum == null) {
            throw new OrderBizException(OrderErrorCodeEnum.ORDER_NO_TYPE_ERROR);
        }
        return orderNoType + getOrderIdKey(orderNoTypeEnum.getMsg(),userId);
    }

    /**
     * 获取订单ID
    */
    private String getOrderIdKey(String orderNoType,String userId) {
        // 6位数时间 + 8位数序列号 + userId后三位
        return getDateTimeKey() + getAutoNoKey(orderNoType) + getUserIdKey(userId);
    }

    /**
     * 生成订单号的中间6位日期
     */
    private String getDateTimeKey() {
        return DateFormatUtil.format(new Date(), "yyMMdd");
    }

    /**
     * 生成订单号中间的8位序列号
     */
    private String getAutoNoKey(String orderNoType) {
        Long autoNo = segmentIDGenService.genNewNo(orderNoType);
        // 获取一个8位数的数字
        return String.valueOf(NumberUtil.genNo(autoNo, 8));
    }

    /**
     * 截取用户ID的后三位
     * @param  userId
     * @return
     */
    private String getUserIdKey(String userId) {
        // 如果userId的长度大于或等于3，则直接返回
        if(userId.length() >= 3) {
            return userId.substring(userId.length() - 3);
        }
        // 如果userId的长度大于或等于3，则直接前面补0
        StringBuilder userIdKey = new StringBuilder(userId);
        while (userIdKey.length() != 3) {
            userIdKey.insert(0, "0");
        }
        return userIdKey.toString();
    }

}
